package com.sunny.design.chain.auth.builderchain;

import com.sunny.design.chain.auth.Member;

/**
 * 责任链模式（Chain of Responsibility Pattern）
 *  责任链模式是将链中每个节点看作是个对象，每个节点处理的请求均不同，且内部自动生窗户个下一节点对象。
 *  当一个请求从链式的首端发出肘，会沿着链的路径依次传递给每个节点对象，直至有对象处理这个请求为止。
 *  属于行为型模式。
 *
 * 适用场景：
 *  1、多个对象可以处理同一请求，但具体由哪个对象处理则在运行时动态决定
 *  2、在不明确指定接收者的情况下，向多个对象中的一个提交一个请求
 *  3、可动态指定一组对象处理请求
 *
 * 优点：
 *  1、将请求与处理解耦
 *  2、请求处理者（节点对象）只需关注自己感兴趣的请求进行处理即可，对于不感兴趣的请求，直接转发给下一级节点对象
 *  3、具备链式传递处理请求功能，请求发送者无需知晓链路结构，只需等待请求处理结果
 *  4、链路结构灵活，可以通过改变链路结构动态地新增或删减责任
 *  5、易于扩展新的请求处理类（节点），符合开闭原则
 *
 * 缺点：
 *  1、责任链太长或者处理时间过长，会影响整体性能
 *  2、如果节点对象存在循环引用时，会造成死循环，导致系统崩溃
 *
 * @author Sunny
 * @date 2020/3/15
 */
public abstract class Handler<T> {
    protected Handler<T> next;

    public void next(Handler<T> handler) {
        this.next = handler;
    }

    public abstract void doHandler(Member member);

    public static class Builder<T>{
        private Handler<T> head;
        private Handler<T> tail;

        public Builder<T> addHandler(Handler<T> handler){
//            do {
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
//            }while (false);//真正框架中，如果是双向链表，会判断是否已经到了尾部
            return this;
        }

        public Handler<T> build(){
            return this.head;
        }

    }
}
